package com.lyl.projectspringboot.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * @author 罗育良
 * @date 2025/6/12 1:29
 * @description 这是一个Redis配置类
 * */

@Configuration
public class RedisConfig {
/**
 * 配置RedisTemplate以支持自定义序列化方式
 * 此方法在Spring框架中定义Bean，用于操作Redis数据存储
 * 它配置了RedisTemplate的各个方面，使其能够以特定的序列化方式处理键和值
 *
 * @param factory Redis连接工厂，用于创建和管理Redis的连接
 * @return 返回一个配置好的RedisTemplate实例，用于执行各种Redis操作
 */
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
    // 创建RedisTemplate实例
    RedisTemplate<String, Object> template = new RedisTemplate<>();

    // 设置连接工厂，用于此模板与Redis服务器建立连接
    template.setConnectionFactory(factory);

//    // 配置键的序列化方式为StringRedisSerializer，确保键以字符串形式存储
//    template.setKeySerializer(new StringRedisSerializer());

    // 配置值的序列化方式为GenericJackson2JsonRedisSerializer，确保值以JSON格式存储
    template.setValueSerializer(new GenericJackson2JsonRedisSerializer());

//    // 配置哈希表键的序列化方式为StringRedisSerializer，确保哈希表的键以字符串形式存储
//    template.setHashKeySerializer(new StringRedisSerializer());

    // 配置哈希表值的序列化方式为GenericJackson2JsonRedisSerializer，确保哈希表的值以JSON格式存储
    template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());

    // 设置默认序列化方式为GenericJackson2JsonRedisSerializer，处理未特别指定序列化方式的场景
    template.setDefaultSerializer(new GenericJackson2JsonRedisSerializer());

    // 初始化RedisTemplate，确保所有必要属性已正确设置
    template.afterPropertiesSet();

    // 返回配置好的RedisTemplate实例
    return template;
}
/**
 * 配置Redis缓存的序列化方式
 *
 * 使用此方法配置Redis缓存主要是为了自定义缓存的序列化策略
 * 默认的缓存配置可能无法满足复杂对象或特定序列化需求
 * 通过使用Jackson2JsonRedisSerializer，我们可以将缓存的值序列化为JSON格式
 * 这对于存储复杂对象或需要进行序列化定制的情况非常有用
 *
 * @return RedisCacheConfiguration对象，包含缓存的配置信息
 */
@Bean
public RedisCacheConfiguration redisCacheConfiguration() {
    // 使用自定义的GenericJackson2JsonRedisSerializer序列化器来序列化缓存的值
    return RedisCacheConfiguration.defaultCacheConfig()
        .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
}




}
